package com.test.designmode.single;

/**
 * 登记式/静态内部类
 * 是否 Lazy 初始化：是
 * <p>
 * 是否多线程安全：是
 * <p>
 * 实现难度：一般
 * <p>
 * 描述：这种方式能达到双检锁方式一样的功效，但实现更简单。
 * 对静态域使用延迟初始化，应使用这种方式而不是双检锁方式。
 * 这种方式只适用于静态域的情况，双检锁方式可在实例域需要延迟初始化时使用。
 * 这种方式同样利用了 classloader 机制来保证初始化 instance 时只有一个线程
 */
public class SingleLazyInner {

    //1.静态内部类
    private static class SingletonHolder {
        //2.静态内部类里-静态实例化目标类
        private static final SingleLazyInner INSTANCE = new SingleLazyInner();
    }

    //3.私有默认构造方法
    private SingleLazyInner() {
    }

    //4.静态最终修饰-get方法
    public static final SingleLazyInner getInstance() {
        //5.返回内部类里已经实例化的目标类
        return SingletonHolder.INSTANCE;
    }

}
